/**
 * 格式转换模块
 * 提供文件数据格式转换相关的功能
 */

/**
 * 检测并记录初始数据格式
 * @param {Array} value - 传入的文件列表数据
 * @returns {String} - 检测到的数据格式类型：'string'或'object'
 */
export const detectInitialDataFormat = (value) => {
  if (Array.isArray(value) && value.length > 0) {
    return typeof value[0] === 'string' ? 'string' : 'object';
  }
  return 'object'; // 默认为对象格式
};

/**
 * 格式化输出数据，保持一致性
 * @param {Array} fileList - 文件列表
 * @param {String} dataFormat - 数据格式类型：'string', 'object'或'auto'
 * @param {String} initialFormat - 初始数据格式类型：'string'或'object'
 * @returns {Array} - 格式化后的数据
 */
export const formatOutputData = (fileList, dataFormat, initialFormat) => {
  // 确定返回类型
  const returnFormat = dataFormat === 'auto' ? initialFormat : dataFormat;
  
  if (returnFormat === 'string') {
    // 返回URL字符串数组
    return fileList.filter(f => f.url).map(f => f.url);
  }
  
  // 返回对象数组
  return fileList;
};

/**
 * 安全获取文件列表，处理不同格式的输入
 * @param {Array} modelValue - 输入的文件列表数据
 * @returns {Array} - 标准化后的文件对象数组
 */
export const getFileList = (modelValue) => {
  // 如果是字符串数组（URL数组），先转换为对象数组
  if (Array.isArray(modelValue) && modelValue.length > 0 && typeof modelValue[0] === 'string') {
    return modelValue.map((url, index) => ({
      name: url.split('/').pop() || `图片${index + 1}`,
      url: url,
      uid: `string_url_${index}`,
      status: 'success'
    }));
  }
  
  // 确保返回数组，即使modelValue为undefined或null
  return Array.isArray(modelValue) ? [...modelValue] : [];
};

/**
 * 处理输入值的变化，支持URL字符串数组转换
 * @param {Array} value - 输入的文件列表数据
 * @param {String} dataFormat - 数据格式类型：'string', 'object'或'auto'
 * @param {String} initialFormat - 初始数据格式类型
 * @param {Function} emitUpdate - 用于发送更新的回调函数
 */
export const processInputValue = (value, dataFormat, initialFormat, emitUpdate) => {
  // 如果是undefined或null，直接返回
  if (!value) return;
  
  // 如果传入的是字符串数组（URL数组）而不是文件对象数组
  if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'string') {
    console.log('检测到URL字符串数组，转换为文件列表格式:', value);
    
    // 创建新的文件列表
    const newFileList = value.map((url, index) => ({
      name: url.split('/').pop() || `图片${index + 1}`,
      url: url,
      uid: `string_url_${index}`,
      status: 'success'
    }));
    
    // 发送更新，根据要求的格式转换
    const formattedData = dataFormat === 'string' ? 
      value : // 保持原始字符串数组
      newFileList; // 转换为对象数组
    
    // 使用emit更新modelValue
    emitUpdate(formattedData);
    return;
  } 
  // 如果是对象数组，确保每个对象都有uid和status
  else if (Array.isArray(value)) {
    const updatedList = value.map((item, index) => {
      // 如果是简单对象，只有url属性
      if (!item.uid && item.url) {
        return {
          name: item.url.split('/').pop() || `图片${index + 1}`,
          url: item.url,
          uid: Date.now() + '_' + index,
          status: 'success',
          ...item
        };
      }
      return item;
    });
    
    // 获取当前文件列表
    const currentFileList = getFileList(value);
    
    // 只有当列表实际有变化时才更新
    if (JSON.stringify(currentFileList) !== JSON.stringify(updatedList)) {
      console.log('规范化文件列表对象:', updatedList);
      
      // 发送更新，根据要求的格式转换
      const formattedData = formatOutputData(updatedList, dataFormat, initialFormat);
      emitUpdate(formattedData);
    }
  }
};

/**
 * 获取URL列表
 * @param {Array} fileList - 文件列表
 * @returns {Array<String>} - URL列表
 */
export const getFileUrls = (fileList) => {
  // 如果列表中的项本身就是字符串（URL），直接返回
  if (fileList.length > 0 && typeof fileList[0] === 'string') {
    return fileList;
  }
  
  // 否则从文件对象中提取URL
  return fileList
    .filter(file => file.status === 'success' && file.url)
    .map(file => file.url);
};

export default {
  detectInitialDataFormat,
  formatOutputData,
  getFileList,
  processInputValue,
  getFileUrls
}; 